package com.jk.utils;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.multipart.MultipartFile;

public class FileUtil {

	/**
	 * 上传
	 * @param imgfile
	 * @param request
	 * @return
	 */
	public static Map uploadFile(MultipartFile imgfile,HttpServletRequest request){
		Map map = new  HashMap();
    	//1、上传路径：项目发布tomcat服务器
		//D:\workUtilsInstall\apache-tomcat-8.0.0\webapps\week_employee_hzy\\upload
//		String path = request.getServletContext().getRealPath("/")+"/upload";
		//如果磁盘路径，需要配置tomcat映射，在tomcat的server.xml目录下面
		
		
//		<Context path="/img" docBase="D:\\img\\upload" reloadable="true" />单斜杠 path为服务器下路径。docBase为磁盘路径。这个是配置tocmat的映射磁盘方式，再server.xml里host标签配置
//		访问路径：http://localhost:8080/img/1.jpg，可以直接将路径进行返回
		String path="D://img//upload";
		//2、文件
		File file = new File(path);
		if(!file.exists()){//不存在
			file.mkdirs();
		}
		
		//生成新的文件名称，原因：防止文件名称一样后者上传的文件会覆盖前者上传的文件（前提是文件名称必须一样并且在用一个目录下）
		//生成新的文件名称，保证文件名称唯一有两种方法：
		// 	  1.通过UUID实现文件名称唯一 （UUID会生成32位字母+数字唯一的一个字符串）
		//	  2.通过时间戳现文件名称唯一  （时间戳是毫秒级时间 时间会一直往上加，生成13位数字）注意只有java生成13位 其他则是10位比如oracle、mysql、php
		//  获取时间戳
		//long currentTimeMillis = System.currentTimeMillis();
		//System.out.println(currentTimeMillis);
		String uuid = UUID.randomUUID().toString();
		
		String oldName = imgfile.getOriginalFilename();//1.jpg
		//截取文件后缀:.jpg
		String suffix = oldName.substring(oldName.lastIndexOf("."));
		//新文件名
		String newFile = uuid+suffix;
		//返回网络访问路径
		String requestPath = "http://"+request.getServerName()+":"+request.getServerPort()+"/img/"+newFile;
		map.put("requestPath", requestPath);
		map.put("filePath", path+"\\"+newFile);
		//3、上传
		////D:\workUtilsInstall\apache-tomcat-8.0.0\webapps\week_employee_hzy\\upload\1.jpg
		File file2 = new File(path+"\\"+newFile);
		try {
			imgfile.transferTo(file2);
		} catch (IllegalStateException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return map;		
	}
	
	
	
	/**
	 * 下载
	 * @param path
	 * @param request
	 * @param response
	 */
	public static void down(String path, HttpServletRequest request, HttpServletResponse response) {
		try {
		      // path是指欲下载的文件的路径。
		      File file = new File(path);
		      // 取得文件名。
		      String filename = file.getName();
		      // 以流的形式下载文件。
		      InputStream fis = new BufferedInputStream(new FileInputStream(path));
		      byte[] buffer = new byte[fis.available()];
//网络通讯往往是间断性的，一串字节往往分几批进行发送。例如对方发来字节长度100的数据，
//		      本地//程序调用available()方法有时得到0，有时得到50，有时能得到100，
//		      大多数情况下是0。这可能是对//方还没有响应，也可能是对方已经响应了，但是数据还没有送达本地。也许分3批到达，也许分批，//也许一次性到达。
		      fis.read(buffer);
		      fis.close();
		      // 清空response
		      response.reset();
		      // 设置response的Header
		      response.addHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes()));
		      response.addHeader("Content-Length", "" + file.length());
		      OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
		      response.setContentType("application/octet-stream");
		      toClient.write(buffer);
		      toClient.flush();
		      toClient.close();
		    } catch (IOException ex) {
		      ex.printStackTrace();
	    }
	}

}
